//
// Created by lenovo on 2024/1/20.
//
#include "Lexer.h"

//void Lexer::negationOptimize() {
//    //保证已经进行了括号结合
//    int i = 0 ;
//    while (i < this->tokens.size()){
//        auto cur = this->tokens[i];
//        if (cur->type == token::Type::OPERATOR){
//            if (
//                    ( (Operator*) cur->base )->OptType == "-")
//            {
//                if (i == 0){
//                    auto* node = (Operator*)this->tokens[0]->base ;
//                    node->pre = new Num(0);
//                    node->post = this->tokens[1]->base;
//
//                    this->tokens.erase(
//                            this->tokens.begin() ,
//                            this->tokens.begin() + 1 + 1
//                    );
//                    this->tokens.insert(
//                            this->tokens.begin() ,
//                            new token(
//                                    token::Type::NUMBER,
//                                    node
//                            )
//                    );
//                    continue;
//                }
//
//                else if (
//                        this->tokens[i - 1]->type != token::NUMBER
//                        and
//                        this->tokens[i - 1]->type != token::RBRACKET
//                        )
//                {
//                    auto* node = (Operator*)this->tokens[i]->base ;
//                    node->pre = new Num(0);
//                    node->post = this->tokens[i + 1]->base;
//
//                    this->tokens.erase(
//                            this->tokens.begin() + i ,
//                            this->tokens.begin() + (i + 1) + 1
//                    );
//                    this->tokens.insert(
//                            this->tokens.begin() + i ,
//                            new token(
//                                    token::Type::NUMBER,
//                                    node
//                            )
//                    );
//                    continue;
//                }
//
//            }
//        }
//        i ++ ;
//    }
//
//}

void Lexer::negationOptimize(){
    if (this->tokens.empty())
        return ;

    //首个负号前添加0
    if (this->tokens[0]->type == token::OPERATOR)
        if (((Operator*)this->tokens[0]->base)->OptType == "-")
            this->tokens.insert(
                    this->tokens.begin(),
                    new token(
                            token::NUMBER,
                            new Num(0)
                            )
                    );

    int i = 0 ;
    //查看负号与负号前一个元素
    while (i < this->tokens.size() - 1){
        auto pre = this->tokens[i];
        auto cur = this->tokens[i + 1];

        if (cur->type != token::OPERATOR){
            i ++ ;
            continue;
        }

        //负号只能在)或者数字的后面
        if (pre->type == token::Type::OPERATOR)
            throw std::logic_error("Contiguous Operator!");
        if (pre->type == token::NUMBER or pre->type == token::RBRACKET){
            i ++ ;
            continue;
        }
        this->tokens.insert(
                this->tokens.begin() + i + 1,
                new token(
                        token::NUMBER,
                        new Num(0)
                )
        );

    }
}